package me.zhengjie.exception.handler;

import com.allwees.bs.core.modelbase.vo.R;
import com.allwees.core.common.exception.BaseException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
import org.springframework.security.authentication.BadCredentialsException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseStatus;
import org.springframework.web.bind.annotation.RestControllerAdvice;

/**
 * 2020.11.25
 * 目前针对服务器的返回，已发客户端并未做任何的特殊处理，只处理了 R.OK 正常处理，其它的错误，返回给用户提示。
 * 所以目前的捕获反馈给用户会不友好，这里需要改进一下 CODE，将不正常的显示过滤到客户端友好的提示。
 * 未来，将严格按照 allwees-code 项目的规范，去重构整个 CODE。
 *
 * NOTE 此为后端返回拦截器，显示真实错误，另外一个前端需要通一异常并返回友好信息。
 * 【目前的项目后端只判断了 R 的 code 作为展示】
 */
/**
 * @author Zheng Jie
 * @date 2018-11-23
 */
@Slf4j
@RestControllerAdvice
@ResponseStatus(HttpStatus.OK)
public class GlobalExceptionHandler {
    /**
     * 处理所有不可知的异常
     */
    @ExceptionHandler(Exception.class)
    public R handleException(Exception e) {
        log.error("===>UnknownExcepton:{}",e.getMessage(),e);
        return R.error(e.getMessage());
    }

    @ExceptionHandler(BaseException.class)
    public R handleBaseException(BaseException e) {
        log.error("===>BaseException:{}",e.getMessage(),e);
        return R.error(e.getCode(),e.getMsg());
    }

    /**
     * BadCredentialsException
     */
    @ExceptionHandler(BadCredentialsException.class)
    public R badCredentialsException(BadCredentialsException e) {
        log.error("===>BadCredentialsException:{}",e.getMessage(),e);
        return R.error("invalid token");
    }

    /**
     * 处理所有接口数据验证异常
     */
    @ExceptionHandler(MethodArgumentNotValidException.class)
    public R methodArgumentNotValidException(MethodArgumentNotValidException e) {
        log.error("===>MethodArgumentNotValidException:{}",e.getMessage(),e);
        String defaultMessage = e.getBindingResult().getAllErrors().get(0).getDefaultMessage();
        return R.error(defaultMessage);
    }
}
